package intermediate

fun main() {
    // 表示一个接收 String 作为参数、返回值为 Int 的函数类型
    var func: (String) -> Int

    // 没有返回值的写成 Unit
    // var func: (String) -> Unit

    // 匿名函数写法
    var func1: (String) -> Int = fun(str: String): Int {
        return 10
    }

    // lambda 表达式写法（单参数可用 it）
    var func2: (String) -> Int = {
        println(it) // it 代替参数 String
        10          // 最后一行自动作为返回值
    }

    // 两个参数的 lambda
    var func3: (String, String) -> Int = { a, b ->
        println(a) // a 表示第一个参数
        println(b) // b 表示第二个参数
        10
    }

    // 只使用第二个参数（第一个用 _ 忽略）
    var func4: (String, String) -> Int = { _, b ->
        // println(a) // ❌ 错误！a 未定义
        println(b)    // ✅ 只能用 b
        10
    }

    // ===== 高阶函数示例 =====
    // 高阶函数：接收函数作为参数，或返回函数
    performAction("Hello", func2) // 传入 lambda

    // 直接传 lambda
    performAction("World") {
        println("Processing: $it")
        it.length
    }

    // ===== Lambda 中显式返回值（带标签）=====
    val result = processWithReturn {
        if (it.isEmpty()) {
            return@processWithReturn -1 // 显式从 lambda 返回
        }
        it.length
    }
    println("Result: $result")
}

// 高阶函数：接收一个字符串和一个函数
fun performAction(input: String, action: (String) -> Int) {
    val result = action(input)
    println("Action result: $result")
}

// 高阶函数：返回一个函数
fun createMultiplier(factor: Int): (Int) -> Int {
    return { number -> number * factor }
}

// 高阶函数：演示 lambda 中使用 return@label
fun processWithReturn(process: (String) -> Int): Int {
    return process("Kotlin")
}